home *** CD-ROM | disk | FTP | other *** search
- /*
- * chrome://tabmixplus/content/links/setup.js
- *
- * original code by Bradley Chapman
- * modified and developped by Hemiola SUN
- * modified again by Bradley Chapman
- *
- */
-
- var __contentAreaClick;
-
- /**
- * @brief Install the link-handling functions of Tab Mix Plus.
- *
- * @returns Nothing.
- */
- function TMP_TBP_init() {
- var eStrings = document.getElementById("extensionsStrings");
- if (eStrings) {
- // we're in the EM
- openURL = TMP_openURL;
-
- // catch call to tabmix options from EM
- eval("gExtensionsViewController.commands.cmd_options ="+gExtensionsViewController.commands.cmd_options.toString().replace(
- 'var optionsURL = aSelectedItem.getAttribute("optionsURL");',
- '$& \ if (TMP_cmd_options(optionsURL)) return;'
- ));
- }
-
- // with MR Tech's local install
- if (typeof(Local_Install) == "object") {
- // use TMP call to TMP Options
- var _aURL = "'chrome://tabmixplus/content/pref/pref-tabmix.xul'";
- eval("Local_Install.createDropDownMenu ="+Local_Install.createDropDownMenu.toString().replace(
- 'aMenuItem.setAttribute("oncommand", thisAction + "; event.stopPropagation();");',
- 'if (thisAction.indexOf(_aURL) != -1) thisAction = "TMP_cmd_options(" + _aURL + ")"; \ $&'
- ));
- }
-
- // we need this only for use our loadSearchInBackground pref
- var autoComplete = document.getElementById("PopupAutoCompleteRichResult");
- if (autoComplete) {
- eval("autoComplete.onPopupClick ="+autoComplete.onPopupClick.toString().replace(
- 'openUILink(url, aEvent);',
- 'TMP_BrowserLoadURL(aEvent, null, null, url);'
- ));
- }
-
- if ("contentAreaClick" in window) {
- __contentAreaClick = window.contentAreaClick;
- window.contentAreaClick = TMP_contentAreaClick;
- }
- window.BrowserOpenTab = TMP_BrowserOpenTab;
- window.openUILink = TMP_openUILink;
- // BrowserLoadURL removed in Firefox 3.5
- if ("BrowserLoadURL" in window)
- window.BrowserLoadURL = TMP_BrowserLoadURL;
-
- // for dotCOMplete extensoin
- if ("dotCOMplete" in window)
- window.dotCOMplete.realBrowserLoadURL = TMP_BrowserLoadURL;
- }
-
- /**
- * @brief Force-call the window observer at least one time.
- *
- * @returns Nothing.
- */
- function TMP_TBP_Startup() {
- try {
- // we can not set this eval in TMP_beforStartup because sometimes
- // TreeStyleTabBrowser don't exist in that early stage, for example when Torbutton is installed
- if ("TreeStyleTabBrowser" in window) {
- eval("TreeStyleTabBrowser.prototype.initTabbar =" + TreeStyleTabBrowser.prototype.initTabbar.toString().replace(
- 'var scrollFrame = document.getAnonymousElementByAttribute(b.mTabContainer, "class", "tabs-frame");',
- 'var scrollFrame = document.getAnonymousElementByAttribute(b.mTabContainer, "anonid", "scroll-tabs-frame");'
- ));
- }
-
- // session manager extension start to add tab before our onWindowOpen run
- // so we initialize this before start
- gWidthFitTitle = TMP_getBoolPref(tabxBranch, "flexTabs", false) &&
- (TMP_getIntPref("", "browser.tabs.tabMaxWidth", 250) != gTabmixPrefs.getIntPref("browser.tabs.tabMinWidth"));
-
- gTMPprefObserver.init();
- // force-call the observer once, in order to kill new windows faster
- TMP_DOMWindowOpenObserver.onObserve(window, TMP_DOMWindowOpenObserver);
-
- // make tabmix compatible with ezsidebar extension
- var TMP_BrowserStartup = "__ezsidebar__BrowserStartup" in window ? "__ezsidebar__BrowserStartup" : "BrowserStartup";
- var bowserStartup = window[TMP_BrowserStartup].toString();
-
- if (gIsFirefox35) {
- var pbs = Cc["@mozilla.org/privatebrowsing;1"].
- getService(Ci.nsIPrivateBrowsingService);
- SessionManager._inPrivateBrowsing = pbs.privateBrowsingEnabled;
-
- bowserStartup = bowserStartup.replace(
- 'gBrowser.swapBrowsersAndCloseOther(gBrowser.selectedTab, uriToLoad);',
- 'var remoteBrowser = uriToLoad.ownerDocument.defaultView.gBrowser; \
- var url = remoteBrowser.getBrowserForTab(uriToLoad).currentURI.spec; \
- var keepLastTab = tabxPrefs.getBoolPref("keepLastTab"); \
- if (!keepLastTab && url != "about:blank") \
- gBrowser.mTabContainer.removeAttribute("hidebutton"); \
- if (!gSingleWindowMode) { \
- window.tabmix_afterTabduplicated = true; \
- $& \
- }'
- );
- }
-
- var stringBundle = document.getElementById("tmp-string-bundle");
- var tabmix_loading = stringBundle.getString("session.loading.label") + "...";
-
- var windowOpeneByTabmix = "tabmixdata" in window;
- var firstWindow = numberOfWindows() == 1;
-
- var disAllow = SessionManager._inPrivateBrowsing || TMP_SessionStore.isSessionStoreEnabled() || "gSessionManager" in window;
- var sessionManager = gTabmixPrefs.getBoolPref("extensions.tabmix.sessions.manager");
- var crashRecovery = gTabmixPrefs.getBoolPref("extensions.tabmix.sessions.crashRecovery");
- var afterRestart = false;
-
- var restoreOrAsk = gTabmixPrefs.getIntPref("extensions.tabmix.sessions.onStart") < 2 || afterRestart;
- var afterCrash = gTabmixPrefs.prefHasUserValue("extensions.tabmix.sessions.crashed");
-
- // don't load home page on first window if session manager or crash recovery is enabled
- window.isLoadHomePage = true;
- if (!disAllow && ((sessionManager && windowOpeneByTabmix) ||
- (firstWindow && crashRecovery && afterCrash) ||
- (firstWindow && sessionManager && restoreOrAsk))) {
- bowserStartup = bowserStartup.replace(
- 'uriToLoad = window.arguments[0];',
- 'uriToLoad = gHomeButton.getHomePage() == window.arguments[0] ? "about:blank" : window.arguments[0];'
- );
- bowserStartup = bowserStartup.replace(
- 'if (window.opener && !window.opener.closed) {',
- 'if (uriToLoad && uriToLoad != "about:blank")\
- for (var i = 0; i < gBrowser.mTabContainer.childNodes.length ; i++)\
- gBrowser.mTabContainer.childNodes[i].loadOnStartup = true;\
- $&'
- );
- if (!("TabGroupsManagerApiVer1" in window)) {
- bowserStartup = bowserStartup.replace(
- 'if (window.opener && !window.opener.closed) {',
- 'if (uriToLoad == "about:blank" || "tabmixdata" in window) {\
- var aBrowser = gBrowser.selectedBrowser;\
- aBrowser.contentDocument.title = tabmix_loading;\
- aBrowser.mIconURL = "chrome://tabmixplus/skin/tmp.png";\
- gBrowser.mCurrentTab.setAttribute("image", aBrowser.mIconURL);\
- }\
- $&'
- );
- }
- }
-
- // call TMP_SessionStore.setService before delayedStartup, so this will run before sessionStore.init
- eval("window."+TMP_BrowserStartup+" ="+bowserStartup.replace(
- 'setTimeout(delayedStartup, 0',
- 'if (numberOfWindows() == 1) TMP_SessionStore.setService(1, true); \
- $&'
- ));
-
- // look for installed extensions that are incompatible with tabmix
- if (gTabmixPrefs.getBoolPref("extensions.tabmix.disableIncompatible")) {
- if (typeof(PlacesController) == "function")
- window.setTimeout(disableExtensions, 3000, window);
- else
- disableExtensions();
- }
-
- // add tabmix menu item to tab context menu before menumanipulator and MenuEdit initialize
- TM_creatMenuItems();
-
- // if nglayout.debug.disable_xul_cache == true sometimes sessionHistory act strange
- // especially with many extensions installed
- var pref = "nglayout.debug.disable_xul_cache";
- if ((!firstWindow && !windowOpeneByTabmix) && gTabmixPrefs.prefHasUserValue(pref) && gTabmixPrefs.getBoolPref(pref))
- window.setTimeout(window[TMP_BrowserStartup], 0);
- else
- window[TMP_BrowserStartup]();
-
- return;
- } catch (ex) {TMP_ASSERT(ex);}
- }
-
- function TMP_delayedStartup() {
- if (gIsFirefox35)
- gBrowser.mTabContainer._newTabButtonWidth = gBrowser.mTabContainer.mTabsNewtabButton.boxObject.width;
-
- SessionManager.init();
- TMP_ClosedTabs.setButtonDisableState();
- gBrowser.mTabContainer.nextTab = 1;
- // convert session.rdf to SessionManager extension format
- convertSession.startup();
-
- // set title at startup if we not use session manager
- // startup page or home page load before bookmarks service
- var i;
- if (gTabmixPrefs.getBoolPref("extensions.tabmix.titlefrombookmark")) {
- for (i = 0; i < gBrowser.mPanelContainer.childNodes.length ; i++) {
- var aBrowser = gBrowser.getBrowserAtIndex(i);
- var aUrl = aBrowser.contentDocument.baseURI;
- aUrl = (aUrl) ? aUrl : aBrowser.currentURI.spec ;
- var bookMarkName = getTitleFromBookmark(aUrl);
- if (bookMarkName && aBrowser.contentDocument.title != bookMarkName)
- aBrowser.contentDocument.title = bookMarkName;
- }
- }
-
- var toolbox = document.getElementById("navigator-toolbox");
- _BrowserToolboxCustomizeDone = toolbox.customizeDone;
- toolbox.customizeDone = function TMP_customizeDone(aToolboxChanged) {
- _BrowserToolboxCustomizeDone(aToolboxChanged);
- try {
- if (aToolboxChanged)
- TMP_BrowserToolboxCustomizeDone();
- // if tabmix option dialog is open update visible buttons and set focus if needed
- var optionWindow = gWindowManager.getMostRecentWindow("mozilla:tabmixopt");
- if (optionWindow) {
- optionWindow.toolbarButtons(window);
- if ("_tabmixCustomizeToolbar" in optionWindow) {
- delete optionWindow._tabmixCustomizeToolbar;
- optionWindow.focus();
- }
- }
- } catch (ex) {TMP_ASSERT(ex, "error in TMP_BrowserToolboxCustomizeDone");}
- };
-
- // when we open bookmark in new window
- // get bookmark itemId and url - for use in getBookmarkTitle
- if ("bookMarkIds" in window) {
- var items = window.bookMarkIds.split("|");
- for (i = 0; i < items.length ; i++) {
- if (items[i] && items[i] > -1)
- gBrowser.mTabContainer.childNodes[i].setAttribute("tabmix_bookmarkId", items[i]);
- }
- delete window.bookMarkIds;
- }
- }
-
- // this must run before all
- function TMP_beforStartup(tabBrowser, aTabContainer) {
- // ODFReader change Cc to something else maybe some other extensions do that too !!!
- if ("Cc" in window && Cc != Components.classes)
- Cc = Components.classes;
-
- if ("Ci" in window && Ci != Components.interfaces)
- Ci = Components.interfaces;
-
- // fix bug in backgroundsaver extension
- // that extension use function with the name getBoolPref
- // we replace it back here
- if ("bgSaverInit" in window && "getBoolPref" in window &&
- getBoolPref.toString().indexOf("return bgSaverPref.prefHasUserValue(sName)") != -1) {
- window.getBoolPref = function getBoolPref ( prefname, def ) {
- try {
- var pref = Components.classes["@mozilla.org/preferences-service;1"]
- .getService(Components.interfaces.nsIPrefBranch);
- return pref.getBoolPref(prefname);
- }
- catch(er) { return def; }
- }
- }
-
- var appInfo = Components.classes["@mozilla.org/xre/app-info;1"]
- .getService(Components.interfaces.nsIXULAppInfo);
- var versionChecker = Components.classes["@mozilla.org/xpcom/version-comparator;1"]
- .getService(Components.interfaces.nsIVersionComparator);
- gIsFirefox35 = versionChecker.compare(appInfo.version, "3.1a2") > 0;
- gIsFirefox36 = versionChecker.compare(appInfo.version, "3.6a1pre") >= 0;
- gIsFirefox37 = versionChecker.compare(appInfo.version, "3.7a1pre") >= 0;
- gisToolbarMode = "mTabDropIndicator" in tabBrowser;
-
- // fix conflict with Lori extension
- // and fix bug in Lori extension that prevent it from closing unread tabs
- if ("loriOldRemoveTab" in tabBrowser) {
- tabBrowser.removeTab = tabBrowser.loriOldRemoveTab;
- delete tabBrowser.loriOldRemoveTab;
- eval("tabBrowser.removeTab ="+tabBrowser.removeTab.toString().replace(
- 'var index = -1;',
- 'var b = this.getBrowserForTab(aTab); \
- if ("loriTabListener" in b) { \
- b.loriTabListener.destroy(); \
- b.loriTabListener = null; \
- } \ $&'
- ));
- }
-
- // we call this here before some other extensions (like Highlander) change handleLinkClick
- // don't call openNewWindowWith when we are in single window mode
- eval("handleLinkClick ="+handleLinkClick.toString().replace(
- 'if (event.shiftKey)',
- 'if (gSingleWindowMode && event.shiftKey) { \
- openNewTabWith(href, doc, null, event, false); \
- event.stopPropagation(); \
- return true; \
- } \
- $&'
- ).replace(
- 'if (tab)',
- 'if (gSingleWindowMode || tab)'
- ));
-
- // remove call to "arrowscrollbox" by "this.mTabContainer.mTabstrip" we don't use it in tabmix
- eval("tabBrowser.moveTabTo ="+tabBrowser.moveTabTo.toString().replace(
- 'this.mTabContainer.mTabstrip.scrollBoxObject.ensureElementIsVisible(this.mCurrentTab);',
- ''
- ));
-
- var tabContainer = aTabContainer || tabBrowser.mTabContainer ||
- document.getAnonymousElementByAttribute(tabBrowser, "anonid", "tabcontainer");
-
- if (gIsFirefox36) {
- eval("tabBrowser.addTab ="+tabBrowser.addTab.toString().replace(
- 'this.tabContainer.mTabstrip._updateScrollButtonsDisabledState();',
- ''
- ));
-
- // nsSessionStore.js use this
- tabContainer.mTabstrip.__defineGetter__("scrollClientSize", function() {
- return tabContainer.mTabstrip.clientWidth;
- });
- }
- else
- eval("tabBrowser.addTab ="+tabBrowser.addTab.toString().replace(
- 'aTabContainer.mTabstrip._updateScrollButtonsDisabledState();',
- ''
- ).replace(
- 'this.mTabContainer.mTabstrip.scrollBoxObject.scrollBy(this.mTabContainer.firstChild.boxObject.width, 0);',
- ''
- ));
-
- if (gIsFirefox35) {
- // for Firefox 3.5+ //
- eval("tabBrowser._endRemoveTab ="+tabBrowser._endRemoveTab.toString().replace(
- 'setTimeout(_delayedUpdate, 0, this.tabContainer);',
- ''
- ).replace(
- 'this.tabContainer.mTabstrip._updateScrollButtonsDisabledState();',
- ''
- ));
-
- tabContainer._fillTrailingGap = function() { }
- tabContainer.mTabstrip.scrollBoxObject = tabContainer.tabstrip.boxObject;
- }
- else {
- // for Firefox 3.0.x //
- eval("tabBrowser.removeTab ="+tabBrowser.removeTab.toString().replace(
- 'setTimeout(_delayedUpdate, 0, this.mTabContainer);',
- ''
- ).replace(
- 'tabStrip.scrollBoxObject.getPosition(scrollPos, {});',
- 'scrollPos.value = -tabStrip.boxObject.width;'
- ).replace(
- 'tabStrip.scrollBoxObject.getScrolledSize(scrolledSize, {});',
- 'scrolledSize.value = 2000;'
- ));
- }
-
- // return true if all tabs in the window are blank
- tabBrowser.isBlankWindow = function() {
- for (var i = 0; i < this.mTabs.length; i++) {
- if (!this.isBlankBrowser(this.getBrowserAtIndex(i)))
- return false;
- }
- return true;
- }
-
- tabBrowser.isBlankTab = function(aTab) {
- return this.isBlankBrowser(this.getBrowserForTab(aTab));
- }
-
- tabBrowser.isBlankNotBusyTab = function TMP_isBlankNotBusyTab(aTab) {
- if (aTab.hasAttribute("busy"))
- return false;
-
- return this.isBlankBrowser(this.getBrowserForTab(aTab));
- }
-
- tabBrowser.isBlankBrowser = function _isBlankBrowser(aBrowser) {
- try{
- if (!aBrowser)
- return true;
- return (!aBrowser.sessionHistory || aBrowser.sessionHistory.index < 0 ||
- (aBrowser.sessionHistory.count < 2 &&
- (!aBrowser.currentURI || aBrowser.currentURI.spec == 'about:blank')));
- } catch (ex) {TMP_ASSERT(ex); return true;}
- }
-
- if (gisToolbarMode) { // after bug 347930 (not drop on trunk yet)
- tabContainer.removeEventListener("overflow", tabBrowser, false);
- tabContainer.removeEventListener("underflow", tabBrowser, false);
- // mTabDropIndicatorBar removed
- tabBrowser.mTabDropIndicatorBar = tabBrowser.mTabDropIndicator.parentNode;
- }
- else {
- tabContainer.mTabstrip.removeEventListener("overflow", tabContainer, false);
- tabContainer.mTabstrip.removeEventListener("underflow", tabContainer, false);
- }
-
- if (tabContainer.mAllTabsPopup && "_updateTabsVisibilityStatus" in tabContainer.mAllTabsPopup) {
- eval("tabContainer.mAllTabsPopup._updateTabsVisibilityStatus ="+tabContainer.mAllTabsPopup._updateTabsVisibilityStatus.toString().replace(
- 'var tabstripBO = tabContainer.mTabstrip.scrollBoxObject;',
- 'var tabstripBO = tabContainer.tabstrip.boxObject;'
- ));
- }
-
- // remove tabs-newtab-button after last tab for firefox 3.0
- if (!gIsFirefox35) {
- var newTabButton = document.getAnonymousElementByAttribute(tabContainer, "class", "tabs-newtab-button");
- if (newTabButton)
- newTabButton.parentNode.removeChild(newTabButton);
- }
-
- try {
- if ("TabGroupsManagerApiVer1" in window)
- TMP_TabGroupsManager.init(tabContainer);
- } catch (ex) {TMP_ASSERT(ex);}
-
- TMP_eventListener.init(tabContainer);
- }
-